#!/bin/bash

# 程序停止脚本

# 显示彩色输出
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 检查PID文件
if [ ! -f "app.pid" ]; then
    echo -e "${RED}错误: 找不到PID文件，应用程序可能未运行${NC}"
    
    # 尝试通过进程名查找并关闭
    echo -e "${YELLOW}尝试查找Java进程...${NC}"
    JAVA_PROCESSES=$(ps -ef | grep java | grep -v grep)
    
    if [ -z "$JAVA_PROCESSES" ]; then
        echo -e "${YELLOW}未找到Java进程${NC}"
        exit 1
    else
        echo -e "${YELLOW}找到以下Java进程:${NC}"
        echo "$JAVA_PROCESSES"
        
        read -p "是否关闭所有Java进程？(y/n): " CONFIRM
        if [ "$CONFIRM" != "y" ]; then
            echo -e "${YELLOW}操作已取消${NC}"
            exit 0
        fi
        
        pkill -f java
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}已关闭所有Java进程${NC}"
        else
            echo -e "${RED}关闭Java进程失败${NC}"
            exit 1
        fi
    fi
    
    exit 0
fi

# 读取PID
PID=$(cat app.pid)
if [ -z "$PID" ]; then
    echo -e "${RED}错误: PID文件为空${NC}"
    rm -f app.pid
    exit 1
fi

# 检查进程是否存在
if ! ps -p $PID > /dev/null; then
    echo -e "${RED}错误: 找不到PID为 $PID 的进程，可能已经停止${NC}"
    rm -f app.pid
    exit 1
fi

# 停止应用程序
echo -e "${YELLOW}正在停止应用程序 (PID: $PID)...${NC}"

# 先尝试正常关闭
kill $PID
echo -e "${YELLOW}已发送停止信号，等待应用程序关闭...${NC}"

# 等待最多30秒
WAIT_TIME=0
while ps -p $PID > /dev/null && [ $WAIT_TIME -lt 30 ]; do
    sleep 1
    WAIT_TIME=$((WAIT_TIME + 1))
    echo -n "."
done
echo ""

# 检查是否成功停止
if ps -p $PID > /dev/null; then
    echo -e "${YELLOW}应用程序未在30秒内停止，正在强制关闭...${NC}"
    kill -9 $PID
    sleep 2
    
    if ps -p $PID > /dev/null; then
        echo -e "${RED}错误: 无法强制停止应用程序${NC}"
        exit 1
    else
        echo -e "${GREEN}应用程序已强制停止${NC}"
    fi
else
    echo -e "${GREEN}应用程序已成功停止${NC}"
fi

# 删除PID文件
rm -f app.pid
echo -e "${GREEN}已删除PID文件${NC}" 